home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
comm
/
suncom.zip
/
TPZCRC.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1988-05-20
|
11KB
|
167 lines
UNIT TPZcrc;
INTERFACE
{ Note: Your crc variable must be initialized to 0, before }
{ using tis routine. }
{ Translated to Turbo Pascal (tm) V4.0 March, 1988 by J.R.Louvau }
{ }
FUNCTION UpdCrc(cp: BYTE; crc: WORD): WORD;
FUNCTION UpdC32(octet: BYTE; crc: LONGINT) : LONGINT;
IMPLEMENTATION
(* crctab calculated by Mark G. Mendel, Network Systems Corporation *)
CONST crctab: ARRAY[0..255] OF WORD = (
$0000, $1021, $2042, $3063, $4084, $50a5, $60c6, $70e7,
$8108, $9129, $a14a, $b16b, $c18c, $d1ad, $e1ce, $f1ef,
$1231, $0210, $3273, $2252, $52b5, $4294, $72f7, $62d6,
$9339, $8318, $b37b, $a35a, $d3bd, $c39c, $f3ff, $e3de,
$2462, $3443, $0420, $1401, $64e6, $74c7, $44a4, $5485,
$a56a, $b54b, $8528, $9509, $e5ee, $f5cf, $c5ac, $d58d,
$3653, $2672, $1611, $0630, $76d7, $66f6, $5695, $46b4,
$b75b, $a77a, $9719, $8738, $f7df, $e7fe, $d79d, $c7bc,
$48c4, $58e5, $6886, $78a7, $0840, $1861, $2802, $3823,
$c9cc, $d9ed, $e98e, $f9af, $8948, $9969, $a90a, $b92b,
$5af5, $4ad4, $7ab7, $6a96, $1a71, $0a50, $3a33, $2a12,
$dbfd, $cbdc, $fbbf, $eb9e, $9b79, $8b58, $bb3b, $ab1a,
$6ca6, $7c87, $4ce4, $5cc5, $2c22, $3c03, $0c60, $1c41,
$edae, $fd8f, $cdec, $ddcd, $ad2a, $bd0b, $8d68, $9d49,
$7e97, $6eb6, $5ed5, $4ef4, $3e13, $2e32, $1e51, $0e70,
$ff9f, $efbe, $dfdd, $cffc, $bf1b, $af3a, $9f59, $8f78,
$9188, $81a9, $b1ca, $a1eb, $d10c, $c12d, $f14e, $e16f,
$1080, $00a1, $30c2, $20e3, $5004, $4025, $7046, $6067,
$83b9, $9398, $a3fb, $b3da, $c33d, $d31c, $e37f, $f35e,
$02b1, $1290, $22f3, $32d2, $4235, $5214, $6277, $7256,
$b5ea, $a5cb, $95a8, $8589, $f56e, $e54f, $d52c, $c50d,
$34e2, $24c3, $14a0, $0481, $7466, $6447, $5424, $4405,
$a7db, $b7fa, $8799, $97b8, $e75f, $f77e, $c71d, $d73c,
$26d3, $36f2, $0691, $16b0, $6657, $7676, $4615, $5634,
$d94c, $c96d, $f90e, $e92f, $99c8, $89e9, $b98a, $a9ab,
$5844, $4865, $7806, $6827, $18c0, $08e1, $3882, $28a3,
$cb7d, $db5c, $eb3f, $fb1e, $8bf9, $9bd8, $abbb, $bb9a,
$4a75, $5a54, $6a37, $7a16, $0af1, $1ad0, $2ab3, $3a92,
$fd2e, $ed0f, $dd6c, $cd4d, $bdaa, $ad8b, $9de8, $8dc9,
$7c26, $6c07, $5c64, $4c45, $3ca2, $2c83, $1ce0, $0cc1,
$ef1f, $ff3e, $cf5d, $df7c, $af9b, $bfba, $8fd9, $9ff8,
$6e17, $7e36, $4e55, $5e74, $2e93, $3eb2, $0ed1, $1ef0
);
(*
* updcrc derived from article Copyright (C) 1986 Stephen Satchell.
* NOTE: First argument must be in range 0 to 255.
* Second argument is referenced twice.
*
* Programmers may incorporate any or all code into their programs,
* giving proper credit within the source. Publication of the
* source routines is permitted so long as proper credit is given
* to Stephen Satchell, Satchell Evaluations and Chuck Forsberg,
* Omen Technology.
*)
FUNCTION UpdCrc(cp: BYTE; crc: WORD): WORD;
BEGIN { UpdCrc }
UpdCrc := crctab[((crc SHR 8) AND 255)] XOR (crc SHL 8) XOR cp
END;
{ Use a type LONGINT variable to store the crc value. }
{ Initialise the variable to $FFFFFFFF before running the crc routine. }
{ VERY IMPORTANT!!!! -> This routine was developed for data communications}
{ and returns the crc bytes in LOW to HIGH order, NOT byte reversed! }
{ To turn the valu into a 'normal' LONGINT, you must reverse the bytes! }
{ e.g. }
{ VAR }
{ l, crc: LONGINT; }
{ list: ARRAY[0..1023] OF BYTE; }
{ counter: INTEGER; }
{ }
{ BEGIN }
{ crc := $FFFFFFFF; (* initialise *) }
{ FillChar(list,SizeOf(list),1); (* dummy array *) }
{ FOR counter := 0 TO (Pred(SizeOf(list))) DO (* run thru *) }
{ crc := UpdC32(buf[counter],crc); (* finding crc *) }
{ FOR counter := 1 TO 4 DO (* reverse *) }
{ l := (l SHL 8) OR BYTE(crc); (* the bytes *) }
{ (* l now contains the 'normalized' crc *) }
{ }
(* Converted to Turbo Pascal (tm) V4.0 March, 1988 by J.R.Louvau *)
(* Copyright (C) 1986 Gary S. Brown. You may use this program, or *)
(* code or tables extracted from it, as desired without restriction. *)
(* *)
(* First, the polynomial itself and its table of feedback terms. The *)
(* polynomial is *)
(* X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0 *)
(* Note that we take it "backwards" and put the highest-order term in *)
(* the lowest-order bit. The X^32 term is "implied"; the LSB is the *)
(* X^31 term, etc. The X^0 term (usually shown as "+1") results in *)
(* the MSB being 1. *)
(* *)
(* Note that the usual hardware shift register implementation, which *)
(* is what we're using (we're merely optimizing it by doing eight-bit *)
(* chunks at a time) shifts bits into the lowest-order term. In our *)
(* implementation, that means shifting towards the right. Why do we *)
(* do it this way? Because the calculated CRC must be transmitted in *)
(* order from highest-order term to lowest-order term. UARTs transmit *)
(* characters in order from LSB to MSB. By storing the CRC this way, *)
(* we hand it to the UART in the order low-byte to high-byte; the UART *)
(* sends each low-bit to hight-bit; and the result is transmission bit *)
(* by bit from highest- to lowest-order term without requiring any bit *)
(* shuffling on our part. Reception works similarly. *)
(* *)
(* The feedback terms table consists of 256, 32-bit entries. Notes: *)
(* *)
(* The table can be generated at runtime if desired; code to do so *)
(* is shown later. It might not be obvious, but the feedback *)
(* terms simply represent the results of eight shift/xor opera- *)
(* tions for all combinations of data and CRC register values. *)
(* *)
(* The values must be right-shifted by eight bits by the "updcrc" *)
(* logic; the shift must be unsigned (bring in zeroes). On some *)
(* hardware you could probably optimize the shift in assembler by *)
(* using byte-swap instructions. *)
(* polynomial $edb88320 *)
(* *)
CONST crc_32_tab: ARRAY[0..255] OF LONGINT = (
$00000000, $77073096, $ee0e612c, $990951ba, $076dc419, $706af48f, $e963a535, $9e6495a3,
$0edb8832, $79dcb8a4, $e0d5e91e, $97d2d988, $09b64c2b, $7eb17cbd, $e7b82d07, $90bf1d91,
$1db71064, $6ab020f2, $f3b97148, $84be41de, $1adad47d, $6ddde4eb, $f4d4b551, $83d385c7,
$136c9856, $646ba8c0, $fd62f97a, $8a65c9ec, $14015c4f, $63066cd9, $fa0f3d63, $8d080df5,
$3b6e20c8, $4c69105e, $d56041e4, $a2677172, $3c03e4d1, $4b04d447, $d20d85fd, $a50ab56b,
$35b5a8fa, $42b2986c, $dbbbc9d6, $acbcf940, $32d86ce3, $